/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.thienloc.omap.controller.services;

import com.thienloc.omap.controller.AbstractCrudBean;
import com.thienloc.omap.entity.LotterySchedule;
import com.thienloc.omap.entity.ServiceConfig;
import com.thienloc.omap.session.LotteryScheduleFacade;
import com.thienloc.omap.session.ServiceConfigFacade;
import com.thienloc.omap.util.JsfUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;

/**
 *
 * @author GiangLT
 */
public abstract class AbstractServiceConfigBean extends AbstractCrudBean {

    @EJB
    protected LotteryScheduleFacade lotteryScheduleFacade;
    @EJB
    protected ServiceConfigFacade facade;
//    chuẩn bị cho phân chia dịch vụ
//    @EJB
//    protected ServiceDivisionConfigFacade serviceDivisionConfigFacade;
//    protected Map<String, String> divisionUsers;
    protected ServiceConfig selected;
    protected List<ServiceConfig> list;
    protected ServiceConfig[] selectedList;
    protected Map<String, String> provinceMap;
    protected Date startViewDate = createStartViewDate();
    protected Date endViewDate = new Date();

    @Override
    protected void resetToCreateFormAction() throws Exception {
        selected = new ServiceConfig();

        Calendar currentTime = Calendar.getInstance();
        Calendar mileStone = Calendar.getInstance();
        mileStone.set(Calendar.HOUR_OF_DAY, 20);
        mileStone.set(Calendar.MINUTE, 0);
        mileStone.set(Calendar.SECOND, 0);

        if (currentTime.before(mileStone)) {
            mileStone.add(Calendar.DATE, -1);
        }

        selected.setStartEffect(mileStone.getTime());
        mileStone.add(Calendar.DATE, 1);
        selected.setEndEffect(mileStone.getTime());

        endViewDate.setHours(23);
        endViewDate.setMinutes(59);
        endViewDate.setSeconds(59);
        onChangeStartDate();
        
//    chuẩn bị cho phân chia dịch vụ
//        List<ServiceDivisionConfig> serviceDivisionConfigs = serviceDivisionConfigFacade.findByFieldName("user");
//        if (serviceDivisionConfigs != null && !serviceDivisionConfigs.isEmpty()) {
//            divisionUsers = new HashMap<String, String>(serviceDivisionConfigs.size());
//            for (ServiceDivisionConfig serviceDivisionConfig : serviceDivisionConfigs) {
//                divisionUsers.put(serviceDivisionConfig.getValue(), serviceDivisionConfig.getValue());
//            }
//        }
        
//        selected.setGeneral1(sessionBean.getOmapUser().getUsername());
    }

    public void onChangeStartDate() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(selected.getStartEffect());

        calendar.add(Calendar.DAY_OF_MONTH, 1);
        selected.setEndEffect(calendar.getTime());

        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        List<LotterySchedule> lotterySchedules = lotteryScheduleFacade.findByDayOfWeek(dayOfWeek);
        provinceMap = new TreeMap<String, String>();
        try {
            for (LotterySchedule lotterySchedule : lotterySchedules) {
                provinceMap.put(lotterySchedule.getProvinceId().getTenTinh() + " - " + lotterySchedule.getProvinceId().getMaTinh(), lotterySchedule.getProvinceId().getMaTinh());
            }
        } catch (Exception ex) {
            logAndNotifyError(ex);
        }
    }

    @Override
    protected void createSelected() throws Exception {
        logger.debug("[{}] Creating entity: {}", getUsername(), selected.toString());
        facade.create(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã thêm mới thành công một bản ghi");
    }

    @Override
    protected void editSelected() throws Exception {
        logger.debug("[{}] Editing entity: {}", getUsername(), selected.toString());
        facade.edit(selected);
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã cập nhật thành công một bản ghi");
    }

    @Override
    protected void findSelected(int id) throws Exception {
    }

    @Override
    protected void prepareEditAction() throws Exception {
        view = false;
        edit = true;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        logger.debug("[{}] Prepare edit entity: {}", getUsername(), selected.toString());
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    @Override
    protected void prepareViewAction() throws Exception {
        view = true;
        edit = false;
        if (selectedList == null || selectedList.length == 0) {
            JsfUtil.addErrorMessage("Lỗi", "Bạn chưa tích chọn bản ghi cần hiển thị");
            return;
        }
        selected = selectedList[0];
        logger.debug("[{}] Prepare view entity: {}", getUsername(), selected.toString());
        if (selectedList.length > 1) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Cảnh báo hiển thị", "Bạn đã chọn nhiều hơn 1 bản ghi. Chỉ bản ghi trên cùng được hiển thị");
        }
    }

    @Override
    protected void removeSelected() throws Exception {
        int size = selectedList.length;
        if (size == 0) {
            JsfUtil.addMessage(FacesMessage.SEVERITY_WARN, "Không có gì để xóa", "Hãy click chọn các bản ghi cần xóa");
            return;
        }
        for (ServiceConfig item : selectedList) {
            facade.remove(item);
            logger.debug("[{}] Deleting entity: {}", getUsername(), item.toString());
        }
        resetToCreateForm();
        JsfUtil.addSuccessMessage("Thành công!", "Đã xóa thành công " + size + " bản ghi");
    }

    public List<ServiceConfig> getList() {
        return list;
    }

    public void setList(List<ServiceConfig> list) {
        this.list = list;
    }

    public ServiceConfig getSelected() {
        return selected;
    }

    public void setSelected(ServiceConfig selected) {
        this.selected = selected;
    }

    public ServiceConfig[] getSelectedList() {
        return selectedList;
    }

    public void setSelectedList(ServiceConfig[] selectedList) {
        this.selectedList = selectedList;
    }

    public Map<String, String> getProvinceMap() {
        return provinceMap;
    }

    public void setProvinceMap(Map<String, String> provinceMap) {
        this.provinceMap = provinceMap;
    }

    public Date getEndViewDate() {
        return endViewDate;
    }

    public void setEndViewDate(Date endViewDate) {
        this.endViewDate = endViewDate;
    }

    public Date getStartViewDate() {
        return startViewDate;
    }

    public void setStartViewDate(Date startViewDate) {
        this.startViewDate = startViewDate;
    }

    private Date createStartViewDate() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }

//    public Map<String, String> getDivisionUsers() {
//        return divisionUsers;
//    }
}
